﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FaissOperation.Interface
{
    /**
     * 向量集合接口
     * 支持添加、删除、搜索向量等操作
     * */
    public interface IVectorCollection<T>
    {
        /// <summary>
        /// 向量集合中各向量的维度
        /// </summary>
        public int Dimension { get; set; }

        /// <summary>
        /// 查询或添加到集合时是否需要进行归一化处理
        /// </summary>
        public bool NormalizeOnAddAndQuery { get; set; }

        /// <summary>
        /// 计算距离的方法
        /// </summary>
        public MetricType MetricTypeInUse { get; set; }

        /// <summary>
        /// 向集合中添加向量
        /// </summary>
        /// <param name="id">向量的ID，在集合中需要保持唯一</param>
        /// <param name="vector">向量本身</param>
        public void AddVector(int id, T vector);

        /// <summary>
        /// 向集合中批量导入向量
        /// <param name="items">一个包含向量ID和向量本身的元组列表</param>
        /// </summary>
        public void AddVectors(IEnumerable<(int id, T Vector)> items);

        /// <summary>
        /// 从集合中删除指定ID的向量
        /// </summary>
        /// <param name="id">被删除的ID</param>
        /// </summary>
        public void RemoveVector(int id);

        /// <summary>
        /// 从集合中批量删除指定ID的向量
        /// </summary>
        /// <param name="ids">被删除的ID数组</param>
        public void RemoveVectors(IEnumerable<int> ids);

        /// <summary>
        /// 从集合中搜索与查询向量最相似的向量
        /// </summary>
        /// <param name="query">查询的向量</param>
        /// <param name="topK">前k个项目</param>
        /// <returns>与查询向量最近接的k个向量</returns>
        /// </summary>
        public IEnumerable<SearchResult> Search(T query, int topK);

        /// <summary>
        /// 删除集合中全部向量
        /// </summary>
        public void Clear();

        /// <summary>
        /// 获取集合的原始数据
        /// </summary>
        /// <returns></returns>
        public PlainCollectionData GetData();

        /// <summary>
        /// 使用原始数据加载集合
        /// <paramref name="data"/>原始数据</param>
        /// </summary> 
        public void LoadData(PlainCollectionData data);

        /// <summary>
        /// 获取集合中向量的数量
        /// </summary>
        public long Count
        {
            get;
        }

        /// <summary>
        /// 是否已经经过训练（对于需要训练的索引类型）
        /// </summary>
        public bool IsTrained
        {
            get;
        }

        /// <summary>
        /// 执行训练操作（对于需要训练的索引类型）
        /// </summary>
        /// <param name="vectors">训练使用的数据</param>
        public void Train(T[] vectors);

        /// <summary>
        /// 销毁集合，释放资源
        /// </summary>
        public void Destory();
    }
}
